#ifndef __SUKVM__
#define __SUKVM__


//vm for tsf32
#ifdef __cplusplus
#include <iostream>
#else
#ifndef nullptr
#define nullptr (void*)(0)
#endif
#endif

#define VMSTACKSIZE 1450
//-2表示执行完毕一个函数
#define VM_CODE_EXEC_OVER -2
#define VM_CODE_EXEC_PREA -1

#define GPIOA_PORT 0
#define GPIOB_PORT 1
#define GPIOC_PORT 2


enum {
    VM_END = 0,                //指令结束
    VM_NOP = 1,             //参数d1支持0-65535
    VM_SETGPIO,             //参数d1支持16位
    VM_RESETGPIO,
    VM_DISPLAY,
    VM_READTK,              //获取触摸按钮信号


    VMSMT_SETGPIO = 32,
    VMSMT_RESETGPIO,
    VMSMT_DISPLAY,

    VMSMT_NOSTACK,
    VMSMT_STACKOVERFLOW,
    VMSMT_NOTEND,
    VMSMT_END
};




//DISP指令，只包含了4个字节
//对于1668 第一指令头6位是 VM_DISPLAY, 低二位是GPIO映射，第二个字节高二位是GPIO口 是GPIO具体针脚，不是掩码需要《《 比如GPIO——1 第三字节是CLD针脚映射，第四字节是STB针脚映射
//后面每个字节包含两个指令，四位为一个，
//如果高位位1，也就是八位的第一位为1（1<<7），那么这个指令是NOP，NOP个数为该指令二位
//如果不为1，看第7位（1<<6），如果第七位为1,则指令停止，1<<2 DIO 1<<1 CLK 1<< STB
//SETGPIO指令
//第一字节的高6为为 VM_SETGPIO 低二位是GPIO映射，即GPIOA B C 第二三字节是是具体的口，只有八个

//RESETGPIO指令 同上

//    VM_READTK
//   第一字节的高6为为 VM_SETGPIO 第二三字节为16位

typedef struct _TS32FXISA {
    char code;
}VTS32FXISA;

typedef struct _FunPointer
{
    void (*setGPIO) (char, short);
    void (*resetGPIO)(char, short);

}FunPointer;

//初始化需要回调的函数
extern FunPointer funPtr;
//表示当前没有执行的函数
extern int VM_FunSel;
//函数碎片，表示执行到哪儿了
extern int VM_CodeSegmentFraction;
//指令空间
extern VTS32FXISA CodeStack[];


//将指令的指针指向第一个，才能开始，
int VmResetISAPos(void);
//获取当前指令的位置
int VmIndex(void);
//指令增加地址
int VmIndexInc(int Bias);
//逐条执行指令，如果
int VmNext(void);

#endif


